package com.ruyi.afterdemo.comm;

import org.springframework.data.domain.Page;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 
 * @author zhangrb
 *
 * @param <T>
 * @param <ID>
 */
public interface CommService<T, ID extends Serializable> {

	/**
	 * 根据注解查询单条记录
	 * @param id
	 * @return
	 */
	public T get(ID id) ;
	
	/**
	 * 查询所有记录
	 * @return
	 */
	public List<T> findAll();
	
	/**
	 * 按指定条件和排序条件进行查询
	 * @param pm 查询条件，每个map中的条件采用and拼接
	 * ，可以穿多个map对象，用 or 进行拼接<br>
	 * <strong>如要按字段排序,请在字段名称加上orderby_前缀，作为可以，value填写asc或desc</strong>
	 * @return
	 */
	public List<T> find(Map<String, Object>... pm);
	
	/**
	 * 按指定的条件进行分页查询
	 * @param pm 查询条件，每个map中的条件采用and拼接
	 * ，可以穿多个map对象，用 or 进行拼接<br>
	 * <strong>如要按字段排序,请在字段名称加上orderby_前缀，作为可以，value填写asc或desc</strong>
	 * <br>
	 * pm 中必须包含2组键值对，<strong>e.g.</strong>{"page":2,"rows":10}
	 * @return
	 */
	public Page<T> findPage(Map<String, Object>... pm);
	
	/**
	 * 保存记录
	 * @param t 对象
	 * @return 主键
	 */
	public ID save(T t);
	
	/**
	 * 批量保存记录
	 * @param c 对象集合
	 * @return
	 */
	public boolean save(Collection<T> c);
	
	/**
	 * 按id删除记录
	 * @param id 主键
	 * @return 
	 */
	public boolean delete(ID id);
	
	/**
	 * 按id批量删除记录
	 * @param l id 集合
	 * @return 
	 */
	public boolean delete(List<ID> l);
	
	/**
	 * 按条件删除记录
	 * @param pm 
	 * @return 
	 */
	public boolean delete(Map<String, Object> pm);
	
	/**
	 * 统计
	 * @param pm
	 * @return
	 */
	public long cnt(Map<String, Object>... pm);
}
